home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / MacGzip 1.0 / source / Mac / unixio.c < prev    next >
Text File  |  1995-05-28  |  2KB  |  147 lines

  1. /* unixio.c - a mini version of Symantec unixio.c */
  2.  
  3. /* Copyright (c) 1993-4 Symantec Corporation.  All rights reserved. */
  4.  
  5. /*
  6. modification history
  7. --------------------
  8. 01a,28may95,ejo  derived from Symantec unixio.c to remove shortcomings.
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <errno.h>
  13. #include <ansi_private.h>
  14. #include <fcntl.h>
  15.  
  16. int _fmode = O_BINARY;
  17.  
  18. static FILE *file(int);
  19.  
  20. int
  21. open(const char *filename, int mode, ...)
  22. {
  23.     int omode = fsRdPerm, oflag = 0;
  24.     
  25.         /*  set read/write permission  */
  26.         
  27.     if (mode & O_WRONLY)
  28.         omode = fsWrPerm;
  29.     if (mode & O_RDWR)
  30.         omode = fsRdWrPerm;
  31.         
  32.         /*  set open flags  */
  33.         
  34.     if (mode & O_CREAT)
  35.         oflag |= F_CREAT;
  36.     if (mode & O_TRUNC)
  37.         oflag |= F_TRUNC;
  38.     if (mode & O_EXCL)
  39.         oflag |= F_EXCL;
  40.     if (mode & O_APPEND)
  41.         oflag |= F_APPEND;
  42.         
  43.         /*  set text/binary mode  */
  44.     
  45.     if (!(mode & (O_TEXT|O_BINARY)))
  46.         mode = _fmode;
  47.     if (!(mode & O_TEXT))
  48.         oflag |= F_BINARY;
  49.         
  50.         /*  open file  */
  51.         
  52.     return(fileno(__open(filename, omode, oflag, __getfile())));
  53. }
  54.  
  55. int
  56. fileno(FILE *fp)
  57. {
  58.     if (fp)
  59.         return(fp - __file);
  60.     return(-1);
  61. }
  62.  
  63. int
  64. read(int fd, char *buf, unsigned n)
  65. {
  66.     FILE *fp;
  67.  
  68.     if (fp = file(fd)) {
  69.         if (n == 0)
  70.             return(0);
  71.         if (fp->dirty)
  72.             fflush(fp);
  73.         n = fread(buf, 1, n, fp);
  74.         if (n || feof(fp))
  75.             return(n);
  76.     }
  77.     return(-1);
  78. }
  79.  
  80.  
  81. int
  82. write(int fd, char *buf, unsigned n)
  83. {
  84.     FILE *fp;
  85.  
  86.     if (fp = file(fd)) {
  87.         if (n == 0)
  88.             return(0);
  89.         if (!fp->dirty)
  90.             fflush(fp);
  91.         n = fwrite(buf, 1, n, fp);
  92.         if (n)
  93.             return(n);
  94.     }
  95.     return(-1);
  96. }
  97.  
  98.  
  99. int
  100. close(int fd)
  101. {
  102.     FILE *fp;
  103.     
  104.     if (fp = file(fd))
  105.         return(fclose(fp));
  106.     return(-1);
  107. }
  108.  
  109.  
  110. long
  111. lseek(int fd, long ofs, int whence)
  112. {
  113.     FILE *fp;
  114.     
  115.     if (fp = file(fd)) {
  116.         if (fseek(fp, ofs, whence) == 0)
  117.             return(ftell(fp));
  118.     }
  119.     return(-1);
  120. }
  121.  
  122. int
  123. unlink(char *filename)
  124. {
  125.     return(remove(filename));
  126. }
  127.  
  128. /*
  129.  *  file - translate "file descriptor" to "file pointer"
  130.  *
  131.  */
  132.  
  133. static FILE *
  134. file(int fd)
  135. {
  136.     register FILE *fp;
  137.     
  138.     if ((unsigned) fd < FOPEN_MAX) {
  139.         fp = &__file[fd];
  140.         if (fp->refnum || fp->std)
  141.             return(fp);
  142.     }
  143.     errno = EBADF;
  144.     return(NULL);
  145. }
  146.  
  147.